﻿using System;
using System.Collections.Generic;
using System.Text;

namespace HiCore.Extensions.UnitOfWork.EntityFramework.Domain
{
    public abstract class AggregateRoot<TKey> : Entity<TKey>, IAggregateRoot
    {
        /// </summary>
        private List<IDomainEvent> _domainEvents;

        /// <summary>
        /// 获取当前实体对象领域事件集合（只读）
        /// </summary>
        public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents?.AsReadOnly();

        /// <summary>
        /// 添加领域事件至当前实体对象领域事件结合中
        /// </summary>
        /// <param name="eventItem"></param>
        public void AddDomainEvent(IDomainEvent eventItem)
        {
            _domainEvents = _domainEvents ?? new List<IDomainEvent>();
            _domainEvents.Add(eventItem);
        }

        /// <summary>
        /// 移除指定领域事件
        /// </summary>
        /// <param name="eventItem"></param>
        public void RemoveDomainEvent(IDomainEvent eventItem)
        {
            _domainEvents?.Remove(eventItem);
        }

        /// <summary>
        /// 清空所有领域事件
        /// </summary>
        public void ClearDomainEvents()
        {
            _domainEvents?.Clear();
        }
    }

    /// <summary>
    /// 聚合根接口
    /// 作用是我们在实现仓储层的时候，让我们的一个仓储对应一个聚合根
    /// </summary>
    public abstract class AggregateRoot : Entity, IAggregateRoot
    {
        /// <summary>
        /// 领域事件集合
        /// </summary>
        private List<IDomainEvent> _domainEvents;

        /// <summary>
        /// 获取当前实体对象领域事件集合（只读）
        /// </summary>
        public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents?.AsReadOnly();

        /// <summary>
        /// 添加领域事件至当前实体对象领域事件结合中
        /// </summary>
        /// <param name="eventItem"></param>
        public void AddDomainEvent(IDomainEvent eventItem)
        {
            _domainEvents = _domainEvents ?? new List<IDomainEvent>();
            _domainEvents.Add(eventItem);
        }

        /// <summary>
        /// 移除指定领域事件
        /// </summary>
        /// <param name="eventItem"></param>
        public void RemoveDomainEvent(IDomainEvent eventItem)
        {
            _domainEvents?.Remove(eventItem);
        }

        /// <summary>
        /// 清空所有领域事件
        /// </summary>
        public void ClearDomainEvents()
        {
            _domainEvents?.Clear();
        }
    }
}
